home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC11.C < prev    next >
Text File  |  1988-07-04  |  4KB  |  190 lines

  1. #include <ctype.h>    /* -hm */
  2.  
  3. /*    execution begins here        */
  4.  
  5.  main(argc,argv)
  6.  int     argc,*argv;
  7.  {
  8.  reperr = NO;        /* no errors yet -hm */
  9.  argcs=argc;
  10.  argvs=argv;
  11.  swend = (swnext = swq)+SWTABSZ-SWSIZ;
  12.  stagelast = stage+STAGELIMIT;
  13.  swactive=            /* not in switch    */
  14.  stagenext=            /* direct output mode    */
  15.  iflevel=            /* #if.. nesting = 0    */
  16.  skiplevel=        /* #if.. not encountered    */
  17.  macptr=        /* stack ptr (relative)     */
  18.  csp=            /* clear the macro pool     */
  19.  errflag=        /* not skipping errors till ";" */
  20.  eof=            /* not eof yet            */
  21.  ncmp=            /* not in compount statement    */
  22.  files=
  23.  filearg=
  24.  quote[1] = 0;
  25.  func1=          /* first function         */
  26.  ccode=1;         /* enable preprocessing     */
  27.  wqptr=wq;         /* clear while queue         */
  28.  quote[0]='"';           /* fake a quote literal         */
  29.  input = input2 = EOF;
  30.  fprintf(stderr,"\nSmall-C Compiler V. 2.0.2 for MC68HC11");
  31.  fprintf(stderr,"\nCompiler Version: %s, %s\n",__DATE__,__TIME__);
  32.  ask();          /* get user options         */
  33.  openin();         /* & initail input file     */
  34.  preprocess();         /* fetch first line         */
  35. glbptr = STARTGLB;
  36. glbflag = 1;
  37. ctext = 0;
  38. header();    /* intro code            */
  39. setops();    /* set values in op arrays    */
  40. parse();    /* process ALL input        */
  41. outside();    /* verify outside any function    */
  42. trailer();    /* follow up code        */
  43. fclose(output);
  44. }
  45. /*
  46. ** process all input text
  47. **
  48. ** At this level, only static declarations,
  49. **    defines, includes and function
  50. **    definitions are legal...
  51. */
  52. parse() {
  53.   while (eof==0) {
  54.     if(amatch("extern", 6))   dodeclare(EXTERNAL);
  55.     else if(dodeclare(STATIC));
  56.     else if(match("#asm"))    doasm();
  57.     else if(match("#include"))doinclude();
  58.     else if(match("#define")) addmac();
  59.     else              newfunc();
  60.     blanks();        /* force eof if pending */
  61.     }
  62. }
  63.  
  64. /*
  65. ** dump the literal pool
  66. */
  67. dumplits(size) int size; {
  68.   int j, k;
  69.   k=0;
  70.   while (k<litptr) {
  71.     defstorage(size);
  72.     j=10;
  73.     while(j--) {
  74.       outdec(getint(litq+k, size));
  75.       k=k+size;
  76.       if ((j==0)|(k>=litptr)) {
  77.     nl();
  78.     break;
  79.     }
  80.       outbyte(',');
  81.       }
  82.     }
  83.   }
  84. /*
  85. ** dump zeroes for default initial values
  86. */
  87. dumpzero(size, count) int size, count; {
  88.   int j;
  89.   while (count > 0) {
  90.     defstorage(size);
  91.     j=30;
  92.     while(j--) {
  93.       outdec(0);
  94.       if ((--count <= 0)|(j==0)) {
  95.     nl();
  96.     break;
  97.     }
  98.       outbyte(',');
  99.       }
  100.     }
  101.   }
  102. /*
  103. ** get run options
  104. */
  105. ask()
  106. {
  107.     int i;
  108.  
  109.     listfp    = 0;
  110.     nxtlab    = 0;
  111.     output    = stdout;
  112.     line    = mline;
  113.  
  114.     alarm    = NO;
  115.     monitor    = NO;
  116.     pause    = NO;
  117.     showcode= NO;        /* do not show c-code in assembler file */
  118.  
  119.     i = 0;
  120.  
  121.     while((getarg(++i, line, LINESIZE, argcs, argvs)) != EOF)
  122.     {
  123.         if(line[0] != '-')
  124.             continue;
  125.         else
  126.         {
  127.             if(toupper(line[1]) == 'C') /* show c source code */
  128.             {
  129.                 showcode = YES;
  130.                 continue;
  131.             }
  132.             if(toupper(line[1]) == 'M') /* show function headers */
  133.             {
  134.                 monitor = YES;
  135.                 continue;
  136.             }
  137.                     if(toupper(line[1]) == 'B') /* begin label no */
  138.             {
  139.                 nxtlab = atoi(&line[2]);
  140.                 continue;
  141.             }
  142.             else
  143.             {
  144.                 usage();
  145.             }
  146.         }
  147.     }
  148. }
  149.  
  150. usage()
  151. {
  152.     fprintf(stderr,"\n usage: sc11 [-c] [-m] [-bxxxx] [<infile] [>outfile]");
  153.     fprintf(stderr,"\n              -c = add c-source to output");
  154.     fprintf(stderr,"\n              -m = monitor compiler work");
  155.     fprintf(stderr,"\n              -b = set label start number\n");
  156.     exit(1);
  157. }
  158.  
  159.  
  160. /*
  161. ** get next input file
  162. */
  163. openin() {
  164.   input=stdin;
  165.   kill();
  166.   }
  167.  
  168. setops() {
  169.     int or(),xor(),and(),eq(),ne(),ule(),le(),uge(),ge();
  170.     int ult(),lt(),ugt(),gt(),asr(),asl(),add(),sub(),mult();
  171.     int div(),mod();
  172.   op2[00]=     op[00]=    or;  /* heir5 */
  173.   op2[01]=     op[01]= xor;  /* heir6 */
  174.   op2[02]=     op[02]= and;  /* heir7 */
  175.   op2[03]=     op[03]=    eq;  /* heir8 */
  176.   op2[04]=     op[04]=    ne;
  177.   op2[05]=ule; op[05]=    le;  /* heir9 */
  178.   op2[06]=uge; op[06]=    ge;
  179.   op2[07]=ult; op[07]=    lt;
  180.   op2[ 8]=ugt; op[ 8]=    gt;
  181.   op2[ 9]=     op[ 9]= asr;  /* heir10 */
  182.   op2[10]=     op[10]= asl;
  183.   op2[11]=     op[11]= add;  /* heir11 */
  184.   op2[12]=     op[12]= sub;
  185.   op2[13]=     op[13]=mult;  /* heir12 */
  186.   op2[14]=     op[14]= div;
  187.   op2[15]=     op[15]= mod;
  188.   }
  189.  
  190.